using System.Security.Cryptography.X509Certificates;

namespace Admin2505.Domain.Entityes.App;
//用户
public class AppUser : EntityBase
{
 public string Username { get; private set; }

//密码
 public string Password {get; private set;}=null!;
 //密码加密
  public string Salt { get; private set; }=null!;
  public string? Nickname { get; set; }
  public string? Avatar { get; set; }
  public string? Telephone { get; set; }
  public string? Email { get; set; }
    private readonly List<AppUserRole> _roles = new List<AppUserRole>();
    public IReadOnlyCollection<AppUserRole> Roles => _roles.AsReadOnly();

    
    #pragma warning disable CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。
    protected AppUser() { }
#pragma warning restore CS8618 // 在退出构造函数时，不可为 null 的字段必须包含非 null 值。请考虑添加 "required" 修饰符或声明为可为 null。



    public AppUser(string username, string password ,string salt)

    {
        if (string.IsNullOrWhiteSpace(username)) throw new ArgumentException("用户名不能为空");
        Username = username;
        Password = password;
        if (string.IsNullOrWhiteSpace(password)) throw new ArgumentException("密码不能为空");
        
        Salt= salt;
        
    }

    // 分配角色（通过角色Id）
    public void AssignRole(AppRole role)
    {
         if (_roles.Any(ur => ur.RoleId == role.Id)) return;
        _roles.Add(new AppUserRole(this, role));
    }

    // 移除角色（通过角色Id）
    public void RemoveRole(AppRole role)
    {
        var userRole = _roles.FirstOrDefault(ur => ur.RoleId == role.Id);
        if (userRole != null) _roles.Remove(userRole);
    }

    // 检查是否具有某个权限（通过权限Id）
    /*
    权限的表达
    crder.Create
    order.Delete
    Order.Uptate
    order.Edit
    order.sqlit
    */

    public bool HasPermission(string permissionName)
    {
        return _roles.Any(ur =>ur.Role.HasPermission(permissionName));
    }
//领域层只负责存储加密hash和salt 不负责加密实现
//DDD模型框架不需要第三方库、保持纯净和可测试性
    public void SetPassword(string password,string salt)
    {
        // Salt = Guid.NewGuid().ToString("N");
        // password = BCrypt.Net.BCrypt.HasPermission(Password);
        Password = password;
        Salt = salt;


    }
    public bool VerifPassword(string password)
    {
        // return BCrypt.Net.BCrypt.verify(password + Salt, Password);
        return Password ==password;
    }
}

